Spring 5 থেকে WebClient ইন্ট্রোডিউস করা হয়েছে, যা Spring WebFlux-এর অংশ। এটি একটি নন-ব্লকিং, রিয়াক্টিভ HTTP ক্লায়েন্ট এবং RestTemplate-এর আধুনিক বিকল্প হিসেবে ব্যবহৃত হয়। WebClient Spring 5 থেকে শুরু করে রিয়াক্টিভ এবং ব্লকিং উভয় ধরনের API কলের জন্য ব্যবহার করা যায়।
pom.xml
এ নিচের নির্ভরতা যোগ করুন:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-webflux</artifactId>
</dependency>
WebClient তৈরি করার দুটি প্রধান পদ্ধতি আছে:
WebClient webClient = WebClient.create();
WebClient webClient = WebClient.builder()
.baseUrl("https://api.example.com")
.build();
২.১ GET Request:
import org.springframework.stereotype.Service;
import org.springframework.web.reactive.function.client.WebClient;
@Service
public class ApiClient {
private final WebClient webClient;
public ApiClient(WebClient.Builder webClientBuilder) {
this.webClient = webClientBuilder.baseUrl("https://api.example.com").build();
}
public String getData(String endpoint) {
return this.webClient.get()
.uri(endpoint) // "/data"
.retrieve()
.bodyToMono(String.class) // Reactive Type
.block(); // Blocking call
}
}
২.২ POST Request:
public String postData(String endpoint, Object requestBody) {
return this.webClient.post()
.uri(endpoint)
.bodyValue(requestBody) // Request Body
.retrieve()
.bodyToMono(String.class)
.block();
}
নন-ব্লকিং পদ্ধতিতে block()
না করে Reactive Streams ব্যবহার করা হয়।
public Mono<String> getReactiveData(String endpoint) {
return this.webClient.get()
.uri(endpoint)
.retrieve()
.bodyToMono(String.class); // Returns Mono<String>
}
WebClient webClient = WebClient.builder()
.baseUrl("https://api.example.com")
.clientConnector(new ReactorClientHttpConnector(
HttpClient.create().responseTimeout(Duration.ofSeconds(5))
))
.build();
public String getDataWithHeaders(String endpoint) {
return this.webClient.get()
.uri(endpoint)
.header("Authorization", "Bearer some-token")
.header("Custom-Header", "value")
.retrieve()
.bodyToMono(String.class)
.block();
}
public String getDataWithErrorHandling(String endpoint) {
return this.webClient.get()
.uri(endpoint)
.retrieve()
.onStatus(HttpStatus::is4xxClientError, clientResponse -> {
return Mono.error(new RuntimeException("4xx Error"));
})
.onStatus(HttpStatus::is5xxServerError, clientResponse -> {
return Mono.error(new RuntimeException("5xx Error"));
})
.bodyToMono(String.class)
.block();
}
public Flux<String> getMultipleData(String endpoint) {
return this.webClient.get()
.uri(endpoint)
.retrieve()
.bodyToFlux(String.class); // Reactive Flux
}
public Mono<Void> downloadFile(String fileUrl, String destination) {
return this.webClient.get()
.uri(fileUrl)
.retrieve()
.bodyToMono(byte[].class)
.doOnNext(bytes -> {
try {
Files.write(Paths.get(destination), bytes);
} catch (IOException e) {
e.printStackTrace();
}
})
.then();
}
Spring WebFlux-এর WebClient একটি আধুনিক HTTP ক্লায়েন্ট যা RestTemplate-এর তুলনায় আরও দক্ষ এবং রিয়াক্টিভ মডেলের জন্য আদর্শ। এটি মাইক্রোসার্ভিস এবং ক্লাউড-নেটিভ অ্যাপ্লিকেশনের জন্য বিশেষভাবে উপযোগী।
Read more